#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>

int main(int argc, char const *argv[])
{
    printf("main进程(%d)开始执行 \n", getpid());

    int num = 100;

    // 创建子进程
    /*
    fork内部创建根据当前进程，来创建一个子进程  （拷贝一份当前进程的内存作为子进程的内存）
        子进程创建完成后，内核会依次执行父进程和子进程
        当选择父进程执行时，fork返回值为子进程的pid
        当选择子进程执行时，fork返回值为0

    程序计数器（PC）：可以看成一个内部的变量，记录的是当前程序执行到的位置

    */
    pid_t pid = fork();
    if (pid == -1) {
        printf("创建子进程失败\n");
        return -1;
    } else if (pid == 0) { // 当前执行的是子进程
        num++;
        printf("子进程(%d)开始执行, 父进程id=%d num=%d, num的地址=%p \n", 
            getpid(), getppid(), num, &num);
    } else { // 当前执行的父进程，也Main进程
        num--;
        printf("父进程(%d)继续执行, 子进程id=%d num=%d, num的地址=%p  \n",
             getpid(), pid, num, &num);
    }
    
    printf("进程(%d)即将执行结束 \n", getpid());

    return 0;
}
